package ar.edu.utn.frsf.tpae.a2014.g01.dao.impl;

import java.util.ArrayList;
import java.util.List;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.AnnotationConfiguration;

import ar.edu.utn.frsf.tpae.a2014.g01.dao.PedidoDAO;
import ar.edu.utn.frsf.tpae.a2014.g01.entidad.Administrador;
import ar.edu.utn.frsf.tpae.a2014.g01.entidad.Cliente;
import ar.edu.utn.frsf.tpae.a2014.g01.entidad.Estado;
import ar.edu.utn.frsf.tpae.a2014.g01.entidad.HistorialPedido;
import ar.edu.utn.frsf.tpae.a2014.g01.entidad.Pedido;
import ar.edu.utn.frsf.tpae.a2014.g01.entidad.Transportista;

public class PedidoHibernateDAO implements PedidoDAO {

	private static PedidoHibernateDAO instance = new PedidoHibernateDAO();
	private SessionFactory sessionFactory = new AnnotationConfiguration()
    .configure().buildSessionFactory();

	public static PedidoHibernateDAO getInstance(){
		return instance;
	}

	private PedidoHibernateDAO(){
		
	}
	

	@Override
	public void crearPedido(Pedido pedido) {
		Session session = sessionFactory.openSession();
	    session.beginTransaction();
	    session.save(pedido);
	    session.getTransaction().commit();
	    session.close();
	    
	}

	@Override
	public void actualizarPedido(Pedido pedido) {
		Session session = sessionFactory.openSession();
	    session.beginTransaction();
	    session.saveOrUpdate(pedido);
	    session.getTransaction().commit();
	    session.close();
	}

	@Override
	public List<Pedido> buscarPedidos(Estado estado) { //XXX not null para cliente transportista y administrador?
		
		String query = "";
		switch(estado){
		
		case ACEPTADO:
			query = "p.administrador is null and p.transportista is null and p.cliente is null";
			break;
		
		case A_RETIRAR:
			query = "p.administrador is not null and p.transportista is null and p.cliente is null";
			break;
		
		case EN_TRANSPORTE:
			query = "p.administrador is not null and p.transportista is not null and p.cliente is null";
			break;
		
		case ENTREGADO:
			query = "administrador is not null and transportista is not null and cliente is not null";
			break;
		
		default:
				return null;
		}
		
		
		Session session = sessionFactory.openSession();
	    session.beginTransaction();
	    List list = session.createQuery("FROM Pedido p WHERE "+query).list();
	    session.getTransaction().commit();
	    session.close();
	    return list;

	}

	@Override
	public void eliminar(Pedido pedido) {
		Session session = sessionFactory.openSession();
	    session.beginTransaction();
	    session.delete(pedido);
	    session.getTransaction().commit();
	    session.close();

	}

	@Override
	public List<Pedido> buscarPedidosRealizados(Cliente cl) {
		Session session = sessionFactory.openSession();
	    session.beginTransaction();
	    List list = session.createQuery("FROM Pedido WHERE ped_cli_id="+cl.getId()).list();
	    session.getTransaction().commit();
	    session.close();
	    return list;
	}

	@Override
	public List<Pedido> buscarPedidosAsignados(Transportista transportista) {
		Session session = sessionFactory.openSession();
	    session.beginTransaction();
	    List list = session.createQuery("FROM Pedido WHERE ped_tra_id="+transportista.getId()).list();
	    session.getTransaction().commit();
	    session.close();
	    return list;
	}

	@Override
	public void asignarPedidoaTransportista(Pedido pedido,
			Transportista transportista) {
		Session session = sessionFactory.openSession();
	    session.beginTransaction();
	    session.saveOrUpdate(pedido);
	    session.getTransaction().commit();
	    session.close();

	}

	@Override
	public void actualizarEstadoOrden(Pedido pedido) {
		Session session = sessionFactory.openSession();
	    session.beginTransaction();
	    session.saveOrUpdate(pedido);
	    session.getTransaction().commit();
	    session.close();
	}

}
